home *** CD-ROM | disk | FTP | other *** search
/ Cream of the Crop 1 / Cream of the Crop 1.iso / PROGRAM / DDJ0992.ARJ / DBDBREG.ASM < prev    next >
Assembly Source File  |  1992-07-05  |  13KB  |  300 lines

  1. ;dbdbreg.asm 
  2. ;Debugger debug register handling routines
  3. ;
  4. .386P
  5. ;---------------------------------------------------------------------------- 
  6. ;Copyright 1991, 1992 ASMicro Co. 
  7. ;7/6/91       Rick Knoblaugh
  8. ;-----------------------------------------------------------------------------
  9.                 include dbequ.inc
  10.                 include dbstruc.inc
  11.  
  12. data            segment para public 'data16' use16
  13.                 extrn   bp_reg_dat:byte
  14.                 extrn   trace_count:word
  15.                 extrn   num_io_bp:byte
  16.                 extrn   write_text:byte
  17.                 extrn   WRITE_LEN:abs
  18.                 extrn   rw_text:byte
  19.                 extrn   RW_LEN:abs
  20.                 extrn   bp_reg_dat:byte
  21.                 extrn   num_reg_type:byte
  22.                 extrn   io_bpdat:byte
  23.                 extrn   io_instrucf:byte
  24. data            ends
  25.  
  26. zcode    segment para public 'code16' use16
  27.  
  28.                 extrn   set_trap:near
  29.                 extrn   format_seg:near
  30.                 extrn   uflags:word
  31.  
  32.                 public  tmp_disable_bp, tmp_disable_all, reset_tmp_dis
  33.                 public  ck_exec_bp, tmp_disable_io, reset_tmp_io 
  34.  
  35.     assume cs:zcode, ds:data, es:nothing
  36.  
  37.  
  38. ck_exec_bp      proc    near
  39.                 mov     ch, 3                   ;get status reg function
  40.                 int     60h                     ;let PL0 code read it
  41.                 mov     si, ax                  ;save status
  42.                 shr     ax, 1                   ;only care about 1-3
  43.                 and     al, 7                   ;any "break points"?
  44.                 jz      short ck_exec550        ;if not, go look for Go
  45.                 mov     dl, 1
  46.                 mov     cx, 3                   ;dr1 through dr3
  47.                 mov     bx, offset bp_reg_dat
  48. ck_exec100:
  49.                 test    al, dl                  ;this one cause break?
  50.                 jz      short ck_exec500        ;if not, try next one
  51.                 cmp     [bx].info_bptype, DEB_TYPE_EXEC ;an exec type?
  52.                 jne     short ck_exec500
  53. ;Determine if this break point is truely active (an old condition 
  54. ;could still cause processor to set bits in DR6 even though it may not
  55. ;be enabled).
  56. ;
  57.                 cmp     [bx].info_bpstat, AVAIL ;is break point enabled?
  58.                 je      short ck_exec500        ;if not, try next one
  59.  
  60.                 cmp     trace_count, 1          ;already tracing?
  61.                 jae     short ck_exec300
  62.  
  63.                 bt      cs:uflags, trapf        ;tracing in user debugger?
  64.                 jc      ck_exec400              ;if so, exit
  65. ck_exec300:
  66.                 call    tmp_disable_all
  67.                 cmp     trace_count, 1          ;already tracing?
  68.                 jae     short ck_exec900
  69.  
  70.                 call    set_trap                ;set trap flag
  71.                 mov     trace_count, 1          ;trace once only
  72. ck_exec400:
  73.                 stc
  74.                 ret
  75. ck_exec500:
  76.                 add     bx, size info_bpreg 
  77.                 shl     dl, 1                   ;check next one
  78.                 loop    ck_exec100
  79. ck_exec550:
  80.                 shr     si, 1                   ;get bit 0 of saved status
  81.                 jnc     short ck_exec900        ;if DR0 didn't cause break
  82. ck_exec600:
  83.                 cmp     trace_count, 1          ;already tracing?
  84.                 jae     short ck_exec900
  85.                 bt      cs:uflags, trapf        ;user debugger tracing?
  86.                 jnc     short ck_exec900
  87. ;disable DR0 Go break point because we're already here within user debugger
  88.                 xor     cx, cx                  ;ch=0 (clear brk ) cl=0 (DR0)
  89.                 xor     ax, ax                  ;no additional bits to clear
  90.                 int     60h                     ;"do_debug_reg" routine
  91.                 jmp     short ck_exec400        ;in user debugger, so exit
  92. ck_exec900:
  93.                 clc
  94. ck_exec999:
  95.                 ret
  96. ck_exec_bp      endp
  97.  
  98.  
  99. ;----------------------------------------------------------------------
  100. ; tmp_disable_bp -  temporarily disable a debug register break point. |
  101. ;                   Flag the appropriate table entry as such and      |
  102. ;                   disable the break point via DR7.                  |
  103. ;                                                                     |
  104. ;             Enter: bx = offset of table entry                       |
  105. ;                    al = 1 through 3                                 |
  106. ;                                                                     |
  107. ;              Exit: break point diabled.                             |
  108. ;                                                                     |
  109. ;        All registers saved.                                         |
  110. ;----------------------------------------------------------------------
  111. tmp_disable_bp  proc    near
  112.                 push    ax
  113.                 push    bx
  114.                 push    cx
  115.                 push    dx              ;must save
  116.                 or      [bx].info_bpstat, DEB_TEMP_DISAB
  117.                 sub     ch, ch          ;indicate disable in DR7
  118.                 mov     cl, al          ;debug register number
  119.                 xor     ax, ax          ;no other bits to clear
  120.                 int     60h             ;do_debug_reg              
  121.                 pop     dx
  122.                 pop     cx
  123.                 pop     bx
  124.                 pop     ax
  125.                 ret
  126. tmp_disable_bp  endp
  127.  
  128. ;----------------------------------------------------------------------
  129. ; tmp_disable_all - temporarily disable all break points which use    |
  130. ;                   debug registers.                                  |
  131. ;                                                                     |
  132. ;        No registers saved.                                          |
  133. ;----------------------------------------------------------------------
  134. tmp_disable_all proc    near
  135. ;
  136. ;First, disable DR0 which is used for Go break points
  137.                 xor     cx, cx                  ;ch=0 (clear brk ) cl=0 (DR0)
  138.                 xor     ax, ax                  ;no additional bits to clear
  139.                 int     60h                     ;"do_debug_reg" routine
  140. ;
  141. ;Next, look for and disable any other debug register type break points.
  142. ;
  143.                 mov     bx, offset bp_reg_dat
  144.                 mov     dl, num_reg_type ;number of debug register brk points
  145.                 or      dl, dl
  146.                 jz      short tmp_da_999 ;exit if none active
  147.                 mov     al, 1            ;else start with DR1
  148. tmp_da_100:
  149.                 cmp     [bx].info_bpstat, AVAIL ;is it set?
  150.                 je      short tmp_da_300 ;if not, try next one
  151.  
  152.                 call    tmp_disable_bp
  153.                 dec     dl              ;number left to check
  154. tmp_da_300:
  155.                 add     bx, size info_bpreg ;next table entry                       
  156.                 inc     al              ;next debug register
  157.                 or      dl, dl          ;check all?
  158.                 jnz     short tmp_da_100                
  159.  
  160. tmp_da_999:
  161.                 ret
  162. tmp_disable_all endp        
  163.  
  164. ;----------------------------------------------------------------------
  165. ; tmp_disable_io - temporarily disable all I/O type break points.     |
  166. ;                                                                     |
  167. ;        No registers saved.                                          |
  168. ;----------------------------------------------------------------------
  169. tmp_disable_io  proc    near
  170.                 sub     ch, ch
  171.                 mov     cl, num_io_bp   ;number of I/O type break points
  172.                 jcxz    tmp_di_999      ;if none, exit
  173.  
  174.                 mov     bx, offset io_bpdat
  175.                 jmp     short tmp_di_200
  176. tmp_di_100:
  177.                 add     bx, size info_io  ;advance to next entry
  178. tmp_di_200:
  179.                 cmp     [bx].io_stat, AVAIL   ;is this one defined?
  180.                 je      short tmp_di_100      ;if not, check next one
  181.                 or      [bx].io_stat, DEB_TEMP_DISAB
  182.                 push    cx                      ;save number I/O break points
  183.                 mov     dx, [bx].io_port        ;get port address
  184.                 sub     ah, ah                  ;clear bit
  185.                 mov     cx, 1                   ;one bit
  186.                 int     61h                     ;do_bit_map
  187.                 pop     cx              ;restore number of I/O break points
  188.  
  189.                 loop    tmp_di_100  
  190. tmp_di_999:
  191.                 ret
  192. tmp_disable_io  endp        
  193.  
  194. reset_tmp_dis   proc    near
  195.                 mov     dl, num_reg_type ;number of debug register bps
  196.                 or      dl, dl
  197.                 jz      short reset_tmp_999  ;exit if none active
  198.                 mov     bx, offset bp_reg_dat
  199.                 mov     cx, 101h        ;else start with DR1 (also ch=1)
  200. reset_tmp_100:
  201.                 test    [bx].info_bpstat, DEB_TEMP_DISAB ;is it temp disabled?
  202.                 jz      short reset_tmp_300 ;if not, try next one
  203.                 and     [bx].info_bpstat, NOT DEB_TEMP_DISAB
  204.                 mov     al, '*'         ;keep existing address etc.
  205. ;Note:  ch=1 indicating set, cl=DRn number
  206.                 push    bx
  207.                 push    cx
  208.                 push    dx
  209.                 int     60h             ;do_debug_reg              
  210.                 pop     dx
  211.                 pop     cx
  212.                 pop     bx
  213.                 dec     dl              ;number left to check
  214. reset_tmp_300:
  215.                 add     bx, size info_bpreg ;next table entry                       
  216.                 inc     cl              ;next debug register
  217.                 or      dl, dl          ;any remaining break points?
  218.                 jnz     short reset_tmp_100                
  219.  
  220. reset_tmp_999:
  221.                 ret
  222. reset_tmp_dis   endp
  223.  
  224.  
  225.  
  226. reset_tmp_io    proc    near
  227. ;
  228. ;Reactivate any I/O break points that were temporarily disabled.  
  229. ;
  230.                 movzx   cx, num_io_bp   ;number of I/O type break points
  231.                 jcxz    reset_tmpio_999   ;exit if none 
  232.                 mov     bx, offset io_bpdat
  233.                 jmp     short reset_tmpio_200
  234. reset_tmpio_100:
  235.                 add     bx, size info_io
  236. reset_tmpio_200:
  237.                 cmp     [bx].io_stat, AVAIL     ;is this one defined?
  238.                 je      short reset_tmpio_100     ;if not, try next one
  239.                 and     [bx].io_stat, NOT DEB_TEMP_DISAB
  240.  
  241.                 push    cx                      ;save number I/O break points
  242.                 mov     dx, [bx].io_port        ;get port address
  243.                 mov     ah, 1                   ;set bit
  244.                 mov     cx, 1                   ;one bit
  245.                 int     61h                     ;do_bit_map
  246.                 pop     cx              ;restore number of I/O break points
  247.  
  248.                 loop    reset_tmpio_100  
  249.  
  250. reset_tmpio_999:
  251.                 ret
  252. reset_tmp_io    endp
  253.  
  254.  
  255.  
  256.  
  257. disp_deb_reg    proc    near
  258.                 push    ax
  259.                 push    bx
  260.                 mov     bx, [bx].brk_off        ;offset of detailed debug info
  261.                 mov     si, [bx].info_bpcmd     ;offset of data for this cmd
  262.                 movzx   cx, [si].cmd_len 
  263.                 mov     si, [si].cmd_text
  264. disp_deb100:
  265.                 movsb
  266.                 inc     di              ;past attribute
  267.                 loop    disp_deb100
  268.                 add     di, 2           ;skip a space
  269.                 push    ds
  270.                 lds     si, dword ptr [bx].info_bpoff ;get address
  271.                 call    format_seg      ;go display it
  272.                 add     di, 2           ;skip a space
  273.                 pop     ds
  274. ;
  275. ;Next, if break point is for data accesses, print a description of
  276. ;the type of access (i.e. "W" or "RW")
  277. ;
  278.                 mov     si, offset write_text ;default to write
  279.                 mov     cx, WRITE_LEN
  280.                 mov     dl, [bx].info_bptype 
  281.                 cmp     dl, DEB_TYPE_WRITE 
  282.                 jb      short disp_deb900 ;if execution type, no direction
  283.                 je      short disp_deb500
  284.                 mov     si, offset rw_text ;r/w description
  285.                 mov     cx, RW_LEN
  286.  
  287. disp_deb500:
  288.                 movsb
  289.                 inc     di
  290.                 loop    disp_deb500
  291. disp_deb900:
  292.                 pop     bx
  293.                 pop     ax
  294.                 ret
  295. disp_deb_reg    endp
  296.  
  297. zcode            ends
  298.             end          
  299.  
  300.